package cn.dlc.com.queue;

import cn.dlc.com.stack.Stack;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.Iterator;

/**
 * @author 邓立川
 * @date 2021/3/21 16:08
 * @desc 当前类的描述信息
 */
@Data
public class Queue<T> implements Iterable<T>{

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    private class Node<T>{
        private T item;
        private Node<T> next;
    }

    // 记录首节点,指向第一个入队列的元素
    private Node<T> head;
    private int num; // 元素个数
    // 最后一个节点
    private Node<T> last;

    public Queue(){
        this.head = new Node<>(null,null);
        this.last = null;
        this.num = 0;
    }

    // 是否为空
    public boolean isEmpty(){
        return this.num == 0;
    }

    // 元素个数
    public int size(){
        return num;
    }

    // 入队列
    public void enQueue(T t) {
        Node<T> newNode = new Node<>(t, null);
        if(isEmpty()) {
            head.setNext(newNode);
            // 设置为最后一个元素
            last = newNode;
        } else {
            // 之前有元素
            last.setNext(newNode);
            last = newNode;
        }
        this.num++;
    }

    // 首节点指向的元素出来
    public T deQueue(){

        if(isEmpty()) {
            return null;
        }
        // 要出队列的元素
        Node<T> oldFirstNode = head.getNext();
        // 要出队列的下一个元素
        Node<T> next = oldFirstNode.getNext();
        // 重新指向
        head.setNext(next);
        // 修改长度
        this.num--;
        // 返回
        return oldFirstNode.getItem();

    }

    @Override
    public Iterator<T> iterator() {

        return new QIterator();
    }

    private class QIterator implements Iterator<T> {

        private Node<T> node;

        public QIterator(){
            this.node = head;
        }


        @Override
        public boolean hasNext() {
            return node.getNext() != null;
        }

        @Override
        public T next() {
            node = node.getNext();
            return node.getItem();
        }
    }
}
